// File Name: step_motor_ctrl.h
// Author: kukukukuku~
// Date: 2024-06-28

#ifndef __STEP_MOTOR_CTRL_H
#define __STEP_MOTOR_CTRL_H

#include "at32f421.h"

#define STEP_MOTOR_GPIO_CRM1                CRM_GPIOA_PERIPH_CLOCK
#define STEP_MOTOR_GPIO_CRM2                CRM_GPIOB_PERIPH_CLOCK
#define STEP_MOTOR_EN_GPIO_PORT             GPIOB
#define STEP_MOTOR_EN_GPIO_PIN              GPIO_PINS_2
#define STEP_MOTOR_MS1_GPIO_PORT            GPIOA
#define STEP_MOTOR_MS1_GPIO_PIN             GPIO_PINS_0
#define STEP_MOTOR_MS2_GPIO_PORT            GPIOA
#define STEP_MOTOR_MS2_GPIO_PIN             GPIO_PINS_5
#define STEP_MOTOR_MS3_GPIO_PORT            GPIOA
#define STEP_MOTOR_MS3_GPIO_PIN             GPIO_PINS_6
#define STEP_MOTOR_DIR_GPIO_PORT            GPIOB
#define STEP_MOTOR_DIR_GPIO_PIN             GPIO_PINS_0
#define STEP_MOTOR_PUL_GPIO_PORT            GPIOB
#define STEP_MOTOR_PUL_GPIO_PIN             GPIO_PINS_1
#define STEP_MOTOR_PUL_GPIO_MUX_SOURCE      GPIO_PINS_SOURCE1
#define STEP_MOTOR_PUL_GPIO_MUX             GPIO_MUX_1

#define STEP_MOTOR_PUL_TMR_CRM              CRM_TMR3_PERIPH_CLOCK
#define STEP_MOTOR_PUL_TMR                  TMR3
#define STEP_MOTOR_PUL_TMR_DIV              (120)
#define STEP_MOTOR_PUL_TMR_PR               (1000)
#define STEP_MOTOR_PUL_TMR_PULSE            (500)
#define STEP_MOTOR_PUL_TMR_CH               TMR_SELECT_CHANNEL_4

#define STEP_MOTOR_ENA                      gpio_bits_reset(STEP_MOTOR_EN_GPIO_PORT, STEP_MOTOR_EN_GPIO_PIN)
#define STEP_MOTOR_DISA                     gpio_bits_set(STEP_MOTOR_EN_GPIO_PORT, STEP_MOTOR_EN_GPIO_PIN)

#define STEP_MOTOR_MS1_H                    gpio_bits_set(STEP_MOTOR_MS1_GPIO_PORT, STEP_MOTOR_MS1_GPIO_PIN)
#define STEP_MOTOR_MS1_L                    gpio_bits_reset(STEP_MOTOR_MS1_GPIO_PORT, STEP_MOTOR_MS1_GPIO_PIN)

#define STEP_MOTOR_MS2_H                    gpio_bits_set(STEP_MOTOR_MS2_GPIO_PORT, STEP_MOTOR_MS2_GPIO_PIN)
#define STEP_MOTOR_MS2_L                    gpio_bits_reset(STEP_MOTOR_MS2_GPIO_PORT, STEP_MOTOR_MS2_GPIO_PIN)

#define STEP_MOTOR_MS3_H                    gpio_bits_set(STEP_MOTOR_MS3_GPIO_PORT, STEP_MOTOR_MS3_GPIO_PIN)
#define STEP_MOTOR_MS3_L                    gpio_bits_reset(STEP_MOTOR_MS3_GPIO_PORT, STEP_MOTOR_MS3_GPIO_PIN)

#define STEP_MOTOR_DIR_CW                   gpio_bits_set(STEP_MOTOR_DIR_GPIO_PORT, STEP_MOTOR_DIR_GPIO_PIN)
#define STEP_MOTOR_DIR_CCW                  gpio_bits_reset(STEP_MOTOR_DIR_GPIO_PORT, STEP_MOTOR_DIR_GPIO_PIN)

//Step_Motor模式
typedef enum StepMotorMode
{
    FULL_STEP,          //200个脉冲步进电机转一圈
    HALF_STEP,          //400个脉冲步进电机转一圈
    QUARTER_STEP,       //800个脉冲步进电机转一圈
    EIGHTH_STEP,        //1600个脉冲步进电机转一圈
    SIXTEENTH_STEP,     //3200个脉冲步进电机转一圈
}StepMotorMode;

//Step_Motor状态
typedef enum StepMotorState
{
    STEP_MOTOR_STOP,
    STEP_MOTOR_CW,
    STEP_MOTOR_CCW,
}StepMotorState;

extern StepMotorState stepMotorState;  //Step_Motor状态
extern StepMotorMode stepMotorMode;    //Step_Motor模式
extern uint8_t stepMotorSpd;           //Step_Motor转速

//Step_Motor配置
void step_motor_config(void);

#endif //__STEP_MOTOR_CTRL_H
